package com.gmss.crawler.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * http请求工具包
 */
@Slf4j
public class CrawlerCommonUtils {

    // 运营商列表
    public static String[] CARRIER_LIST = {"移动", "联通", "电信"};

    /**
     * 保存文件
     *
     * @param result     数据
     * @param writerPath 写入地址
     */
    public static void saveFile(String result, String writerPath) {
        File file = new File(writerPath);
        File parent = file.getParentFile();
        if (parent != null && !parent.exists()) {
            parent.mkdirs();
        }
        BufferedWriter bw = null;
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
            bw.write(result + "\n");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
            }
        }
    }

    /**
     * 根据地址获得数据的字节流    下载图片
     *
     * @param strUrl 网络连接地址
     * @return
     */
    public static byte[] getImageFromNetByUrl(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
            byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
            return btImg;
        } catch (Exception e) {
            log.error("下载图片 - 根据地址获得数据的字节流  Exception：{}", e);
        }
        return null;
    }


    /**
     * 个人照片保存到本地
     */
    public static void getPersonalImgSave(String imgUrl, String filePath, String fileName) {
        byte[] btImg = getImageFromNetByUrl(imgUrl);
        if (null != btImg && btImg.length > 0) {
            log.debug("读取到：" + btImg.length + " 字节");
            writeImageToDisk(btImg, filePath, fileName);
        } else {
            log.info("没有从该连接获得内容");
        }
    }

    /**
     * 从输入流中获取数据
     *
     * @param inStream 输入流
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

    /**
     * 返回doc树
     *
     * @param url2
     * @return
     */
    public static Document getDocument(String url2) {
        Document doc = null;
        String userAgen = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22";
        try {
            doc = Jsoup.connect(url2)
                    .timeout(8000)
                    .ignoreHttpErrors(true)
                    .followRedirects(true)
                    .userAgent(userAgen)
                    .header("accept-language", "zh-cn")
                    .get();
        } catch (Exception e) {
            if (!StringUtils.equalsAny(url2, "http", "https"))
                log.error("Exception:{}", e);
        }
        return doc;
    }

    /**
     * http请求下载文件http://hc.apache.org/httpcomponents-client-ga/examples.html
     *
     * @param url
     * @param headers           http头信息
     * @param addDefaultHeaders 是否添加默认的头信息
     * @return String
     * @throws IOException
     * @author songkun
     * @create 2014年9月25日 下午3:46:33
     */
    public static final String download(String url, Map<String, String> headers, boolean addDefaultHeaders)
            throws IOException {
        if (url == null || url.length() <= 0) {
            return null;
        }
        CloseableHttpClient httpClient = null;
        for (int i = 0; i < 3; i++) {// 尝试3次
            try {
                httpClient = HttpClients.createDefault();
                HttpGet httpget = new HttpGet(url);
                if (addDefaultHeaders) {// 添加默认的头信息
                    httpget.setHeader("Content-Type", "text/html; charset=UTF-8");
                    httpget.setHeader("User-Agent", "Mozilla/5.0");
                }
                if (headers != null) {
                    for (Iterator<Entry<String, String>> iterator = headers.entrySet().iterator(); iterator.hasNext(); ) {
                        Entry<String, String> entry = iterator.next();
                        if (entry.getKey() != null && entry.getKey().length() > 0) {
                            httpget.setHeader(entry.getKey(), entry.getValue());
                        }
                    }
                }
                HttpResponse responce = httpClient.execute(httpget);// 得到response对象
                int status = responce.getStatusLine().getStatusCode();// 返回码
                if (status >= 200 && status < 300) {// 200正常 其他就不对
                    // 获得相应实体
                    HttpEntity entity = responce.getEntity();
                    return entity != null ? EntityUtils.toString(entity) : null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (httpClient != null) {
                    httpClient.close();
                }
            }
        }
        return null;
    }

    /**
     * 解析Html页面
     *
     * @param line
     * @return String
     * @author songkun
     * @create 2014年7月26日 下午5:37:43
     */
    public static final String decode(String line) {
        StringBuilder builder = new StringBuilder();
        StringBuilder result = new StringBuilder();
        boolean begin = false;
        char c;
        for (int i = 0; i < line.length(); i++) {
            c = line.charAt(i);
            if (c == '&' && (i + 1 < line.length()) && line.charAt(i + 1) == '#') {
                begin = true;
                result.append(builder);// 把存放在builder中的字符串放到结果中
                builder.setLength(0);
                i = i + 1;
                continue;
            }
            if (c == ';' && begin) {// 解码
                try {
                    result.append((char) Integer.valueOf(builder.toString()).intValue());
                } catch (Exception e) {
                    result.append("&#").append(builder).append(c);
                }
                builder.setLength(0);
                begin = false;
                continue;
            }
            builder.append(c);
        }
        if (begin) {// 比如：dff&#8888,后面的&#888并非转义
            return builder.length() > 0 ? result.append("&#").append(builder).toString() : result.toString();
        }
        return result.append(builder).toString();
    }

    /**
     * 判断字符串中是否含有中文
     *
     * @param str
     * @return boolean
     * @author songkun
     * @create 2014年7月30日 下午1:05:30
     */
    public static final boolean hasChineseCharacter(String str) {
        char c;
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c < 40623 && c >= 19968) {// 中文
                return true;
            }
        }
        return false;
    }

    /**
     * 是否存在ascii字符
     *
     * @param str
     * @return boolean
     * @author songkun
     * @create 2014年7月30日 下午4:01:49
     */
    public static final boolean hasAsciiCharacter(String str) {
        char c;
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c < 256) {// Ascii
                return true;
            }
        }
        return false;
    }

    /**
     * 是否全是中文
     *
     * @param str
     * @return boolean
     * @author songkun
     * @create 2014年7月30日 下午4:10:06
     */
    public static final boolean isAllChineseCharacter(String str) {
        char c;
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c >= 40623 || c < 19968) {// 中文
                return false;
            }
        }
        return true;
    }

    /**
     * 是否全是ASCII
     *
     * @param str
     * @return boolean
     * @author songkun
     * @create 2014年7月30日 下午4:10:17
     */
    public static final boolean isAllAsciiCharacter(String str) {
        char c;
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c > 255) {// Ascii
                return false;
            }
        }
        return true;
    }

    /**
     * 获取整型数字(从左边start开始，遇到的第一个数字开始截取，直到非数字字符结束)
     *
     * @param str
     * @param start
     * @return Integer
     * @author songkun
     * @create 2014年7月31日 上午9:24:52
     */
    public static final Integer getIntValue(String str, int start) {
        if (str == null || str.length() <= 0 || start < 0 || start > str.length()) {
            return null;
        }
        boolean begin = false;
        StringBuilder builder = new StringBuilder(10);
        char c;
        for (int i = start; i < str.length(); i++) {
            c = str.charAt(i);
            if (begin && (c < '0' || c > '9')) {// 不做小数点后的处理
                break;
            }
            if (c >= '0' && c <= '9') {
                builder.append(c);
                begin = true;
            }
        }
        if (builder.length() > 0) {
            return Integer.parseInt(builder.toString());
        }
        return null;
    }

    /**
     * 截取end前的数字串，比如：45455&lt;/a&gt;88,end=str.indexOf('&lt;/a&gt;'),则，输出为45455
     *
     * @param str
     * @param end
     * @return Integer
     * @author songkun
     * @create 2014年7月31日 上午11:45:31
     */
    public static final Integer getIntValueBeforeEnd(String str, int end) {
        if (str == null || str.length() <= 0 || end <= 0 || end >= str.length()) {
            return null;
        }
        boolean begin = false;
        StringBuilder builder = new StringBuilder(10);
        char c;
        for (int i = end; i >= 0; i--) {
            c = str.charAt(i);
            if (begin && (c < '0' || c > '9')) {// 不做小数点后的处理
                break;
            }
            if (c >= '0' && c <= '9') {
                builder.insert(0, c);
                begin = true;
            }
        }
        if (builder.length() > 0) {
            return Integer.parseInt(builder.toString());
        }
        return null;
    }

    /**
     * 截取end前的数字串，比如：45455&lt;/a&gt;88,end=str.indexOf('&lt;/a&gt;'),则，输出为45455
     *
     * @param str
     * @param end
     * @return String
     * @author songkun
     * @create 2014年9月27日 上午9:56:29
     */
    public static final String getNumbersBeforeEnd(String str, int end) {
        if (str == null || str.length() <= 0 || end <= 0 || end >= str.length()) {
            return null;
        }
        boolean begin = false;
        StringBuilder builder = new StringBuilder(10);
        char c;
        for (int i = end; i >= 0; i--) {
            c = str.charAt(i);
            if (begin && (c < '0' || c > '9')) {// 不做小数点后的处理
                break;
            }
            if (c >= '0' && c <= '9') {
                builder.insert(0, c);
                begin = true;
            }
        }
        if (builder.length() > 0) {
            return builder.toString();
        }
        return null;
    }

    /**
     * 从字符串中截取浮点型数字
     *
     * @param str
     * @return Float
     * @author songkun
     * @create 2014年8月12日 下午4:30:32
     */
    public static final Float getFloatValue(String str) {
        StringBuilder number = new StringBuilder();
        boolean begin = false;
        char c = 0;
        int pointCount = 0;
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (!begin && c >= '0' && c <= '9') {// 遇到数字
                begin = true;
            }
            if (begin) {
                if (c == '.') {// 计数
                    pointCount = pointCount + 1;
                }
                if ((number.length() > 0 && c == '.' && pointCount == 1) || (c >= '0' && c <= '9')) {
                    number.append(c);
                } else {
                    break;
                }
            }
        }
        if (number.length() > 0) {
            try {
                return Float.parseFloat(number.toString());
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        return null;
    }

    /**
     * 截取标签内的数据
     *
     * @param line
     * @param start
     * @return String
     * @author songkun
     * @create 2014年8月1日 下午3:05:55
     */
    public static final String getInnerText(String line, int start) {
        if (start < 0 || line == null || line.length() <= 0 || start >= line.length()) {
            return null;
        }
        char c;
        StringBuilder builder = new StringBuilder();
        boolean begin = false;
        for (; start < line.length(); start++) {
            c = line.charAt(start);
            if (c == '>') {
                begin = true;
                continue;
            }
            if (begin == true && c == '<') {
                break;
            }
            if (begin) {
                builder.append(c);
            }
        }
        if (builder.length() > 0) {
            return builder.toString();
        }
        return null;
    }

    /**
     * 截取两引号之间的字符<br/>
     * (3'47'f3"f->47),(a"3d"b'ds's->3d),(e"d'ss'->null),(e"d's'"4->d's')
     *
     * @param str
     * @param start 开始处理的位置
     * @return String
     * @author songkun
     * @create 2014年7月31日 上午9:37:26
     */
    public static final String getStringBetweenQuates(String str, int start) {
        if (str == null || str.length() <= 0 || start < 0 || start > str.length()) {
            return null;
        }
        boolean begin = false;
        StringBuilder builder = new StringBuilder(10);
        char c, startChar = 0;

        for (int i = start; i < str.length(); i++) {
            c = str.charAt(i);
            // 遇到引号结束截取,遇到\',\" 也截取
            if (begin && (startChar == c || (c == '\\' && str.length() > i + 1 && str.charAt(i + 1) == startChar))) {
                return builder.toString();
            }
            if (begin == false && (c == '"' || c == '\'')) {// 遇到引号开始截取
                begin = true;
                startChar = c;
                continue;
            }
            if (begin) {
                builder.append(c);
            }
        }
        return null;
    }

    /**
     * 加载本地html文件
     *
     * @param localFilePath 本地文件路径
     * @return
     * @throws IOException
     */
    public static Document getDocumentHtml(String localFilePath) {
        try {
//		Resource resource = new ClassPathResource("/htmlTest/baidu-常进.html");
            Resource resource = new ClassPathResource(localFilePath);
//		System.out.println(resource.getFile());
            String filePath = resource.getFile().getAbsolutePath();
            File inputFile = new File(filePath);
            return Jsoup.parse(inputFile, "UTF-8", "");
        } catch (Exception e) {
            log.error("getDocumentHtml Exception : {}", e);
        }
        return null;
    }

    public static Document getDocumentByFile(String localFilePath) {
        try {
            File inputFile = new File(localFilePath);
            return Jsoup.parse(inputFile, "UTF-8", "");
        } catch (Exception e) {
            log.error("getDocumentByFile Exception : {}", e);
        }
        return null;
    }

    /**
     * 将不完整的html转换成完的html
     *
     * @param str
     * @return
     */
    public static Document getDocumentByString(String str) {
        Document doc = Jsoup.parseBodyFragment(str);
        return doc;
    }

    public static void main(String[] args) {
//		System.out.println(CommonUtils.replaceBlank("菲立普·希阿雷 Philippe G. Ciarlet"));
//		System.out.println(CommonUtils.replaceBlank("菲立普·希阿雷"));
        String nameDian = "·";
        String foreignNameTwo = "";
        String foreignName = CommonUtils.replaceBlank("菲立普 · 希阿雷 Philippe G. Ciarlet").replaceAll("·", nameDian);
        if (foreignName.contains(nameDian)) {
            String[] manyNames = foreignName.split(nameDian);
            for (String str : manyNames) {
                if (isAllChineseCharacter(str)) {
                    foreignNameTwo = foreignNameTwo + str;
                }
                ;
            }
            System.out.println(foreignNameTwo);
            foreignNameTwo = foreignNameTwo.substring(0, foreignNameTwo.lastIndexOf(nameDian));
        }

        System.out.println(foreignNameTwo);
    }

    /**
     * 拆分中英文
     *
     * @param str
     * @return List<String>
     * @author songkun
     * @create 2014年7月30日 下午4:35:19
     */
    public static final List<String> splitEnCn(String str, int maxSplit) {
        if (str == null || str.length() <= 0) {
            return null;
        }
        List<String> list = new ArrayList<String>();
        if (maxSplit < 2) {// 不用拆分
            list.add(str);
            return list;
        }
        char c;
        boolean beginEn = false;
        boolean beginCn = false;
        StringBuilder cnBuilder = new StringBuilder(10);
        StringBuilder enBuilder = new StringBuilder(10);
        c = str.charAt(0);
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (beginCn == false && c < 40623 && c >= 19968) {// 中文
                beginCn = true;
                beginEn = false;
                cnBuilder.setLength(0);
                if (enBuilder.length() > 0) {
                    list.add(enBuilder.toString());
                }
                enBuilder.setLength(0);
            }
            if (beginEn == false && c < 256) {
                beginCn = false;
                beginEn = true;
                enBuilder.setLength(0);
                if (cnBuilder.length() > 0) {
                    list.add(cnBuilder.toString());
                }
                cnBuilder.setLength(0);
            }
            if (maxSplit == list.size() + 1) {
                if (enBuilder.length() > 0) {
                    list.add(enBuilder.toString());
                }
                if (cnBuilder.length() > 0) {
                    list.add(cnBuilder.toString());
                }
                enBuilder.setLength(0);
                cnBuilder.setLength(0);
                list.add(str.substring(i));
                break;
            }
            if (beginCn) {
                cnBuilder.append(c);
            }
            if (beginEn) {
                enBuilder.append(c);
            }
        }
        if (enBuilder.length() > 0) {
            list.add(enBuilder.toString());
        }
        if (cnBuilder.length() > 0) {
            list.add(cnBuilder.toString());
        }
        return list;
    }

    /**
     * 获取运营商
     *
     * @param line
     * @return String
     * @author songkun
     * @create 2014年8月5日 下午5:53:59
     */
    public static final String getCarrier(String line) {
        if (line == null || line.length() <= 0) {
            return null;
        }
        if (CARRIER_LIST != null) {
            for (int i = 0; i < CARRIER_LIST.length; i++) {
                if (line.indexOf(CARRIER_LIST[i]) >= 0) {
                    return CARRIER_LIST[i];
                }
            }
        }
        return null;
    }

    /**
     * 获取包下的所有PagesCompent注解过的Pages对象
     *
     * @author http://guoliangqi.iteye.com/blog/644876
     * @create 2014年7月27日 下午7:07:58
     * @param pack
     * @return
     * @return Collection<Pages>
     */
//	public static Collection<Pages> getPagesInstances(String pack) {
//		// 第一个class类的集合
//		Map<String, Pages> instances = new HashMap<String, Pages>();
//		// 是否循环迭代
//		boolean recursive = true;
//		// 获取包的名字 并进行替换
//		String packageName = pack;
//		String packageDirName = packageName.replace('.', '/');
//		// 定义一个枚举的集合 并进行循环来处理这个目录下的things
//		Enumeration<URL> dirs;
//		try {
//			dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
//			// 循环迭代下去
//			while (dirs.hasMoreElements()) {
//				// 获取下一个元素
//				URL url = dirs.nextElement();
//				// 得到协议的名称
//				String protocol = url.getProtocol();
//				// 如果是以文件的形式保存在服务器上
//				if ("file".equals(protocol)) {
//					// 获取包的物理路径
//					String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
//					// 以文件的方式扫描整个包下的文件 并添加到集合中
//					findAndAddClassesInPackageByFile(packageName, filePath, recursive, instances);
//				} else if ("jar".equals(protocol)) {
//					// 如果是jar包文件
//					// 定义一个JarFile
//					System.err.println("jar类型的扫描");
//					JarFile jar;
//					try {
//						// 获取jar
//						jar = ((JarURLConnection) url.openConnection()).getJarFile();
//						// 从此jar包 得到一个枚举类
//						Enumeration<JarEntry> entries = jar.entries();
//						// 同样的进行循环迭代
//						while (entries.hasMoreElements()) {
//							// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
//							JarEntry entry = entries.nextElement();
//							String name = entry.getName();
//							// 如果是以/开头的
//							if (name.charAt(0) == '/') {
//								// 获取后面的字符串
//								name = name.substring(1);
//							}
//							// 如果前半部分和定义的包名相同
//							if (name.startsWith(packageDirName)) {
//								int idx = name.lastIndexOf('/');
//								// 如果以"/"结尾 是一个包
//								if (idx != -1) {
//									// 获取包名 把"/"替换成"."
//									packageName = name.substring(0, idx).replace('/', '.');
//								}
//								// 如果可以迭代下去 并且是一个包
//								if ((idx != -1) || recursive) {
//									// 如果是一个.class文件 而且不是目录
//									if (name.endsWith(".class") && !entry.isDirectory()) {
//										// 去掉后面的".class" 获取真正的类名
//										String className = name.substring(packageName.length() + 1, name.length() - 6);
//										try {
//											String tmp = packageName + '.' + className;
//											if (!instances.containsKey(tmp)) {
//												Class<?> clazz = Class.forName(tmp);
//												if (clazz.getAnnotation(PagesCompent.class) != null) {
//													Object object = clazz.newInstance();
//													if (object instanceof Pages) {
//														instances.put(tmp, (Pages) object);
//													}
//												}
//											}
//										} catch (ClassNotFoundException e) {
//											// log
//											// .error("添加用户自定义视图类错误 找不到此类的.class文件");
//											e.printStackTrace();
//										} catch (InstantiationException e) {
//											// TODO Auto-generated catch block
//											e.printStackTrace();
//										} catch (IllegalAccessException e) {
//											// TODO Auto-generated catch block
//											e.printStackTrace();
//										}
//									}
//								}
//							}
//						}
//					} catch (IOException e) {
//						// log.error("在扫描用户定义视图时从jar包获取文件出错");
//						e.printStackTrace();
//					}
//				}
//			}
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		return instances.values();
//	}

    /**
     * 以文件的形式来获取包下的所有Class
     *
     * @param packageName
     * @param packagePath
     * @param recursive
     * @param instances
     */
//	private static void findAndAddClassesInPackageByFile(String packageName, String packagePath,
//			final boolean recursive, Map<String, Pages> instances) {
//		// 获取此包的目录 建立一个File
//		File dir = new File(packagePath);
//		// 如果不存在或者 也不是目录就直接返回
//		if (!dir.exists() || !dir.isDirectory()) {
//			// log.warn("用户定义包名 " + packageName + " 下没有任何文件");
//			return;
//		}
//		// 如果存在 就获取包下的所有文件 包括目录
//		File[] dirfiles = dir.listFiles(new FileFilter() {
//			// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
//			public boolean accept(File file) {
//				return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
//			}
//		});
//		// 循环所有文件
//		for (File file : dirfiles) {
//			// 如果是目录 则继续扫描
//			if (file.isDirectory()) {
//				findAndAddClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive,
//						instances);
//			} else {
//				// 如果是java类文件 去掉后面的.class 只留下类名
//				String className = file.getName().substring(0, file.getName().length() - 6);
//				try {
//					// 添加到集合中去
//					// classes.add(Class.forName(packageName + '.' +
//					// className));
//					// 经过回复同学的提醒，这里用forName有一些不好，会触发static方法，没有使用classLoader的load干净
//					String tmp = packageName + '.' + className;
//					if (!instances.containsKey(tmp)) {
//						Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(tmp);
//						if (clazz.getAnnotation(PagesCompent.class) != null) {
//							Object object = clazz.newInstance();
//							if (object instanceof Pages) {
//								instances.put(tmp, (Pages) object);
//							}
//						}
//					}
//				} catch (ClassNotFoundException e) {
//					// log.error("添加用户自定义视图类错误 找不到此类的.class文件");
//					e.printStackTrace();
//				} catch (InstantiationException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				} catch (IllegalAccessException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//			}
//		}
//	}

    /**
     * 获取正则中间字段
     *
     * @param line
     * @param p
     * @return
     * @author KONGJF
     */
    public static String setItemValue(String line, Pattern p) {
        Matcher m = p.matcher(line);
        if (m.find()) {
            return m.group(1).trim();
        }
        return null;
    }

    public static List<String> setItemList(String line, Pattern p) {
        List<String> list = new ArrayList<String>();
        Matcher m = p.matcher(line);
        while (m.find()) {
            list.add(m.group(1).trim());
        }
//        for (int i = 1; m.find(i); i++) {
//			list.add(m.group(i).trim());
//		}
        return list;
    }


    /**
     * 将图片写入到磁盘
     *
     * @param img      图片数据流
     * @param filePath 文件保存时的路径
     * @param fileName 文件保存时的名称
     */
    public static void writeImageToDisk(byte[] img, String filePath, String fileName) {
        try {
            File pathFile = new File(filePath);
            if (!pathFile.exists()) {
                pathFile.mkdirs();
            }

            File file = new File(filePath + fileName);
//			File file = new File("D:\\creditCard\\img_" + fileName);
            FileOutputStream fops = new FileOutputStream(file);
            fops.write(img);
            fops.flush();
            fops.close();
//			System.out.println("图片已经写入磁盘");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
